package xyz.wpxy.service;

import xyz.wpxy.domain.ScoreInformation;

import java.math.BigDecimal;
import java.util.*;

/**
 * @author 星星制作者
 * @Description 利用数组实现至少存储五个学生的信息 学生成绩管理系统的主界面如下图所示
 * @createTime 2021年12月24日 14:30:00
 */
public class ScoreManagement {

    private static Map<String, List> scoreMap = new HashMap<>();

    /**
     * key: 存储学号
     * ScoreInformation:学生信息
     */
    private static Map<String, ScoreInformation> studentMap = new HashMap<>();

    //用户输入:
    private static Scanner scanner = new Scanner(System.in);

    //学生信息管理表:
    private ScoreInformation scoreInformation = new ScoreInformation();

    /**
     * 存储 基础数据
     */
    public static void setScoreInformation() {
        /*
         存储 五个学生的信息 :
         */
        ScoreInformation scoreInformation1 = new ScoreInformation("20183557", "小明", 3.4, 2.5, 3.9, 2.8, 1.7);
        ScoreInformation scoreInformation2 = new ScoreInformation("20183558", "卫莱", 3.3, 2.2, 3.6, 2.3, 1.5);
        ScoreInformation scoreInformation3 = new ScoreInformation("20183559", "小星", 2.3, 1.2, 1.6, 1.3, 1.6);
        ScoreInformation scoreInformation4 = new ScoreInformation("20183560", "小花", 3.8, 2.1, 3.7, 2.9, 1.1);
        ScoreInformation scoreInformation5 = new ScoreInformation("20183561", "小娃", 3.1, 2.3, 3.2, 2.6, 1.4);
        /*
            将五个集合存储到Map集合中:
         */
        studentMap.put("20183557", scoreInformation1);
        studentMap.put("20183558", scoreInformation2);
        studentMap.put("20183559", scoreInformation3);
        studentMap.put("20183560", scoreInformation4);
        studentMap.put("20183561", scoreInformation5);
    }


    /**
     * 学生考试成绩录入
     */
    public static void getStudentInformation() {
        //输入学生的学号:
        System.out.println("请输入八位的学号:");
        String stunumber = scanner.next();
        //定时器:
        Integer count = 0;
         /*
            判断输入是否有误：
         */
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();
            if (stunumber.equals(studentID)) {
                count++;
            }
        }

        // 遍历Map集合
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();


            if (count == 0) {
                System.out.println("输入有误！");
                return;
            }
            //如果不是key，跳过此循环
            if (!stunumber.equals(studentID)) {
                continue;
            }

            //获取value:
            ScoreInformation scoreInformation = entry.getValue();

            System.out.println("***********************************************************");
            System.out.println("安徽文达信息工程学院学生学籍管理系统 2022版");
            System.out.println("学生考试成绩录入界面");
            System.out.println("***********************************************************");
            System.out.println("学生学号：" + stunumber);

            //输入学生的高等数学成绩:
            System.out.println("请输入学生的高等数学成绩:");
            Double mathematicsscore = scanner.nextDouble();

            //输入学生的大学英语成绩:
            System.out.println("请输入学生的大学英语成绩：");
            Double englishiscore = scanner.nextDouble();

            //输入学生的计算机网络成绩:
            System.out.println("请输入学生的计算机网络成绩:");
            Double networkscore = scanner.nextDouble();

            //输入存储学生的数据库成绩:
            System.out.println("请输入存储学生的数据库成绩:");
            Double databasescore = scanner.nextDouble();

            //输入学生的软件工程成绩：
            System.out.println("请输入学生的软件工程成绩：");
            Double softwarescore = scanner.nextDouble();

            System.out.println("***********************************************************");
            System.out.println("安徽文达信息工程学院学生学籍管理系统 2022 版");
            System.out.println("学生考试成绩录入");
            System.out.println("***********************************************************");
            System.out.println("学生学号：" + studentID);
            System.out.println("高等数学成绩：" + mathematicsscore);
            System.out.println("大学英语成绩：" + englishiscore);
            System.out.println("计算机网络成绩:" + networkscore);
            System.out.println("数据库成绩" + databasescore);
            System.out.println("软件工程成绩:" + softwarescore);
            System.out.println("该学生成绩已录入完毕，是否提交:(true/false)");
            boolean flag = scanner.nextBoolean();
            //如果输入true:
            if (flag) {
                //存储到scoreInformation中:
                scoreInformation.setStunumber(stunumber);
                scoreInformation.setNAME(scoreInformation.getNAME());
                scoreInformation.setMathematicsscore(mathematicsscore);
                scoreInformation.setEnglishiscore(englishiscore);
                scoreInformation.setNetworkscore(networkscore);
                scoreInformation.setDatabasescore(databasescore);
                scoreInformation.setSoftwarescore(softwarescore);
                System.out.println("录入成功！");
                break;
            } else {
                break;
            }

        }
    }

    /**
     * 学生考试成绩修改
     */
    private static void updateStudentInformation() {
        System.out.println("***********************************************************");
        //输入学生的学号:
        System.out.println("请输入八位的学生学号:");
        String stunumber = scanner.next();
        //定时器:
        Integer count = 0;
         /*
            判断输入是否有误：
         */
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();
            if (stunumber.equals(studentID)) {
                count++;
            }
        }

        // 遍历Map集合
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();

            if (count == 0) {
                System.out.println("输入有误！");
                return;
            }
            //如果不是key，跳过此循环
            if (!stunumber.equals(studentID)) {
                continue;
            }

            //获取value:
            ScoreInformation scoreInformation = entry.getValue();
            System.out.println("***********************************************************");
            System.out.println("安徽文达信息工程学院学生学籍管理系统 2022 版");
            System.out.println("学生考试成绩修改");
            System.out.println("***********************************************************");
            System.out.println("学生学号：" + stunumber);
            System.out.println("学生姓名：" + scoreInformation.getNAME());
            System.out.println("1.高等数学成绩：" + scoreInformation.getMathematicsscore());
            System.out.println("2.大学英语成绩：" + scoreInformation.getEnglishiscore());
            System.out.println("3.计算机网络成绩:" + scoreInformation.getNetworkscore());
            System.out.println("4.数据库成绩：" + scoreInformation.getDatabasescore());
            System.out.println("5.软件工程成绩：" + scoreInformation.getSoftwarescore());

            System.out.println("***********************************************************");
            System.out.println("安徽文达信息工程学院学生学籍管理系统 2022版");
            System.out.println("学生考试成绩修改界面");
            System.out.println("***********************************************************");
            System.out.println("学生学号：" + stunumber);
            System.out.println("学生姓名：" + scoreInformation.getNAME());

            System.out.println("请输入修改后的高等数学成绩：");
            Double mathScore = scanner.nextDouble();


            System.out.println("请输入修改后的大学英语成绩：");
            Double englishScore = scanner.nextDouble();


            System.out.println("请输入修改后的计算机网络成绩:");
            Double networkScore = scanner.nextDouble();


            System.out.println("请输入修改后的数据库成绩:");
            Double databaseScore = scanner.nextDouble();


            System.out.println("请输入修改后的软件工程成绩：");
            Double softwareScore = scanner.nextDouble();

            System.out.println("**********************************************************");
            System.out.println("学生学号：" + stunumber);
            System.out.println("学生姓名：" + scoreInformation.getNAME());
            System.out.println("1.高等数学成绩：" + mathScore);
            System.out.println("2.大学英语成绩：" + englishScore);
            System.out.println("3.计算机网络成绩:" + networkScore);
            System.out.println("4.数据库成绩：" + databaseScore);
            System.out.println("5.软件工程成绩：" + softwareScore);

            System.out.println("该学生成绩已录入完毕，是否提交:(true/false)");
            boolean flag = scanner.nextBoolean();
            //如果输入true:
            if (flag) {
                //存储到scoreInformation中:
                scoreInformation.setStunumber(stunumber);
                scoreInformation.setNAME(scoreInformation.getNAME());
                scoreInformation.setMathematicsscore(mathScore);
                scoreInformation.setEnglishiscore(englishScore);
                scoreInformation.setNetworkscore(networkScore);
                scoreInformation.setDatabasescore(databaseScore);
                scoreInformation.setSoftwarescore(softwareScore);
                System.out.println("修改成功！");
                break;
            } else {
                break;
            }
        }
    }


    /**
     * 计算学生成绩绩点
     */
    private static void CalculateTheGradePoint() {
        System.out.println("***********************************************************");
        System.out.println("安徽文达信息工程学院学生学籍管理系统 2022 版");
        System.out.println("学生考试成绩绩点计算界面");
        System.out.println("***********************************************************");
        //输入学生的学号:
        System.out.println("请输入八位的学生学号:");
        String stunumber = scanner.next();
        //定时器:
        Integer count = 0;
         /*
            判断输入是否有误：
         */
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();
            if (stunumber.equals(studentID)) {
                count++;
            }

        }

        // 遍历Map集合
        for (Map.Entry<String, ScoreInformation> entry : studentMap.entrySet()) {
            //获取key:
            String studentID = entry.getKey();

            if (count == 0) {
                System.out.println("输入有误！");
                return;
            }
            //如果不是key，跳过此循环
            if (!stunumber.equals(studentID)) {
                continue;
            }
            //获取value:
            ScoreInformation scoreInformation = entry.getValue();
            System.out.println("学生学号：" + stunumber);
            System.out.println("学生姓名：" + scoreInformation.getNAME());
            /**
             * 绩点计算:
             */
            //存放绩点：
            List<Double> scoreCount = new ArrayList<>();

            //获取高等数学成绩:
            Double mathematicsscore = scoreInformation.getMathematicsscore();
            //获得绩点：
            Double mathGradePoint = getGradePoint(mathematicsscore);
            scoreCount.add(mathGradePoint);

            //获取大学英语成绩：
            Double englishiscore = scoreInformation.getEnglishiscore();
            //获得绩点:
            Double englishScoreGradePoint = getGradePoint(englishiscore);
            scoreCount.add(englishScoreGradePoint);

            //计算机网络成绩:
            Double networkscore = scoreInformation.getNetworkscore();
            //获得绩点:
            Double networkScoreGradePoint = getGradePoint(networkscore);
            scoreCount.add(networkScoreGradePoint);

            //获取数据库成绩:
            Double databasescore = scoreInformation.getDatabasescore();
            //获得绩点:
            Double databaseScoreGradePoint = getGradePoint(databasescore);
            scoreCount.add(databaseScoreGradePoint);

            //软件工程成绩:
            Double softwarescore = scoreInformation.getSoftwarescore();
            //获得绩点:
            Double softwareScoreGradePoint = getGradePoint(softwarescore);
            scoreCount.add(softwareScoreGradePoint);

            /**
             * 平均学分绩点=∑ （ 课程绩点× 该课程学分） /∑ 课程学分
             */
            //各科学分:
            int[] arrs = {4, 3, 4, 3, 2};
            //平均绩点：
            Double scoreAvg = 0.0;
            //遍历总绩点:
            for (int i = 0; i < scoreCount.size(); i++) {
                scoreAvg += scoreCount.get(i) * arrs[i];
            }
            scoreAvg /= 16;
            boolean flag = true;
            if (scoreAvg < 2) {
                flag = false;
            }

            System.out.println("1、高等数学成绩绩点：" + mathGradePoint);
            System.out.println("2、大学英语成绩绩点：" + englishScoreGradePoint);
            System.out.println("3、计算机网络成绩绩点：" + networkScoreGradePoint);
            System.out.println("4、数据库成绩绩点:" + databaseScoreGradePoint);
            System.out.println("5、软件工程成绩绩点：" + softwareScoreGradePoint);
            //四舍五入 保留两位小数:
            System.out.println("你的平均绩点为：" + new BigDecimal(scoreAvg).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
            if (flag) {
                System.out.println("提示信息：你的学分绩点已达到毕业要求！");
            } else {
                System.out.println("你的学分绩点不满足毕业要求！");
            }
            System.out.println("是否返回系统主界面：true/false");
            boolean g = scanner.nextBoolean();
            if (g) {
                break;
            }

        }
    }

    /**
     * 获取绩点
     */
    private static Double getGradePoint(Double score) {
        if (score >= 90) score = 4.0;
        else if (score >= 85 && score < 90) score = 3.7;
        else if (score >= 82 && score < 85) score = 3.3;
        else if (score >= 78 && score < 82) score = 3.0;
        else if (score >= 75 && score < 78) score = 2.7;
        else if (score >= 72 && score < 75) score = 2.3;
        else if (score >= 68 && score < 72) score = 2.0;
        else if (score >= 66 && score < 68) score = 1.7;
        else if (score >= 64 && score < 66) score = 1.5;
        else if (score >= 60 && score < 64) score = 1.0;

        return score;
    }


    /**
     * 执行方法
     */
    public static void main(String[] args) {
        setScoreInformation();

        while (true) {

            System.out.println("***********************************************************");
            System.out.println("安徽文达信息工程学院学生学籍管理系统 2022版");
            System.out.println("***********************************************************");
            System.out.println("1、 学生考试成绩录入");
            System.out.println("2、 学生考试成绩修改");
            System.out.println("3、 计算学生成绩绩点");
            System.out.println("4、退出学籍管理系统");
            System.out.println("**********************************************************");
            //用户输入符：
            Integer flag = new Scanner(System.in).nextInt();
            switch (flag) {
                case 1:
                    getStudentInformation();
                    break;
                case 2:
                    updateStudentInformation();
                    break;
                case 3:
                    CalculateTheGradePoint();
                    break;
                case 4:
                    System.out.println("***********************************************************");
                    System.out.println("谢谢使用安徽文达信息工程学院学生学籍管理系统 2022 版");
                    System.out.println("制作人：卫鹏");
                    return;
            }

        }


    }


}



